/**
 这个consoletable 是ascii码的全自动模板 自动添加空格和对齐
 如果需要写中文的话。需要改bean里面的 封装模板 把 head的字段改的越长越好，最好中英结合，加计算单位。
 方便自动添加空格和对齐
 */
package 第二十章项目.clothesSystem.utils;

import 第二十章项目.clothesSystem.bean.Clothes;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ConsolePrinter {
    List<Clothes> srclist=XMLPaser_new.getpostlist();
    public void test() {
        //heads和data写在homeclass里面了 如果要写1.需要一个List<Clothes> list  2.head 和data 需要分离
        //printTable(heads,data);
    }
    //打印表格
    public static void printTable(String[] heads,String[][] data){
        if(null==heads||heads.length<=0){
            throw new BusinessException("heads[]can't be null!");
        }
        if(null==data||null==data[0]|| data[0].length<=0){
            throw new BusinessException("data[][]can't be null!");
        }
        if(heads.length!=data[0].length){
            throw new BusinessException("(heads[] ,data[][])row's length can't match!");
        }
        int rowNum =heads.length;
        int lineNum=data.length;
        Map<Integer,Integer> rowWidthMap=getRowWidthMap(rowNum,lineNum,heads,data);
        printHead(rowNum,rowWidthMap,heads);
        printData(rowNum,lineNum,rowWidthMap,data);
    }
    public static Map<Integer,Integer>getRowWidthMap(int rowNum,int lineNum,String[] heads,String[][] data){
        Map<Integer,Integer> rowWidthMap=new HashMap<>();
        for(int i=0;i<rowNum;i++){
            //每个head 字段的长度
            int len=length(heads[i]);
            //如果没值 就设置 key 和value
            if(null== rowWidthMap.get(i)){
                rowWidthMap.put(i,len);
                //不能超过len heads字段的长度
            }else if(rowWidthMap.get(i)<len){
               rowWidthMap.put(i,len);
            }
        }// 一共8行没行8字段每个字段的长度
        //System.out.println("head: "+rowWidthMap.toString());
        //计算除head的每行字段长度 和几行
        for(int i=0;i<lineNum;i++){
            for(int j=0;j<rowNum;j++){
                int len=length(data[i][j]);
                //如果是空值就放， 如果更新的话，值< 下一行列的值（值在这里代表字段的所有字符长度）就更新
                if(null==rowWidthMap.get(j)){
                    rowWidthMap.put(j,len);
                }else if(rowWidthMap.get(j)<len){
                    rowWidthMap.put(j,len);
                }
            }
        }
        return rowWidthMap;
    }

    public static void printLine(int rowNum,Map<Integer,Integer> map){
        //System.out.println("printline: "+map);
        for(int i=0;i<rowNum;i++){
            int len=map.get(i);
            System.out.print("+");
            for(int k=0; k<len;k++){
                if(i!=rowNum-1) {
                    System.out.print("-");
                }else{
                    System.out.print("-");
                }
            }
        }
        System.out.print("+");
        System.out.println();
    }



    public static void printHead(int rowNum,Map<Integer,Integer> rowWidthMap,String[] heads){
        printLine(rowNum,rowWidthMap);
        for(int h=0;h<rowNum;h++){
            System.out.print("|");
            //body每个字段的长度
            int actLength=rowWidthMap.get(h);
            //head每个字段的长度
            int dataLength=length(heads[h]);
            executePrintData(actLength,dataLength,heads[h]);
            if(h==rowNum-1){
                System.out.print("|");
            }
        }
        System.out.println();
        printLine(rowNum,rowWidthMap);
    }

    public static void printData(int rowNum,int lineNum,Map<Integer,Integer>rowWidthMap, String[][] data){
        for(int j=0;j<lineNum;j++){
            for(int i=0;i<rowNum;i++){
                System.out.print("|");
                //data的每个字段的长度
                int dataLength=length(data[j][i]);
                //head和body中 行的最长字段的长度
                int actLength=rowWidthMap.get(i);
                executePrintData(actLength,dataLength,data[j][i]);
                if(i==rowNum-1){
                    System.out.print("|");
                }
            }
            System.out.println();
            printLine(rowNum,rowWidthMap);
        }
        System.out.println();
    }
//包装空格 修改解决中文问题
    public static void executePrintData(int actLength,int dataLength,String data){
        if(actLength>dataLength){
            int num=actLength-dataLength;
            //如果head字段比body字段长度长1个字节 那么该body字段向左对齐
            if(num==1){
                System.out.print(data);
                System.out.print(" ");
                //居中对齐 多的字节数为:1.双 多几个字字节 前后空格平分 2.单 对半分 后多一个空
            }else{
                int beforeNum=num/2;
                int afterNum=num-beforeNum;
                for(int m=0;m<beforeNum;m++){
                    System.out.print(" ");
                }
                System.out.print(data);
                for(int m=0;m<afterNum;m++){
                    System.out.print(" ");
                }
            }
        }   else{
            //body字段比head字段长 就不填空格
            System.out.print(data);
        }
    }

    public static int length(String str){
        if (isBlank(str)){
            return 0;
        }
        return str.length();
    }
    //字符序列 可以是string sbuilder sbuff  是否是空白单元
    //是 长度为0，或者是空白 各种控制符 /r /t /f ...
    public static boolean isBlank(CharSequence cs) {
        int strLen = length_isBlank(cs);
        if (strLen == 0) {
            return true;
        } else {
            for(int i = 0; i < strLen; ++i) {
                if (!Character.isWhitespace(cs.charAt(i))) {
                    return false;
                }
            }
            return true;
        }
    }
    //如果为空 返回0 else 字符序列的长度
    public static int length_isBlank(CharSequence cs) {
        return cs == null ? 0 : cs.length();
    }
}
